查看原文
其他

为什么在线备份启动有时候比较慢? | Db2 技巧

disizhishou twt企业IT社区 2022-07-03

当在线备份命令提交后,需要数秒甚至几分钟后才能通过db2pd -util / LIST UTILITES看到它开始执行,这是为什么呢?

原因

在线备份启动阶段需要刷脏页到磁盘。只有当脏页被刷到磁盘后,备份才真正开始读容器并创建备份影像。 如果启动在线备份时缓冲池里面有大量的脏页,那么启动阶段会比较慢,因为把这些脏页刷到磁盘需要一定时间。

诊断问题

在启动阶段,对应的协调EDU (db2agent)需要调用方法sqlbFlush执行IO刷脏页,其stack大致如下:

pwrite64
sqloseekwrite64
sqloWriteBlocks
sqlbWritePageToDisk
sqlbWritePage
sqlbProcessDStack
sqlbFlushForDLSubset
sqlbFlush
sqlubInitAgentCB
sqlubcka
sqlubcka_route_in
sqlerKnownProcedure

从io监控工具(比如 iostat),你应该能观察到对应表空间的容器所在磁盘有大量的磁盘写操作。你可以通过下面的方法监控刷脏页的进度:

$ db2pd -db <db_name> -dirtypages summary

解决问题

在线备份意味着备份发生时,数据库上还有未提交的交易,也有未刷到磁盘的脏页, 所以,在数据库被restore后并不能立即被连接,还需要rolled forward到某个数据一致的时间点,而Rollfoward的起始位置(即日志记录)又下面两个LSN的较小值决定:

lowTransLsn: 最早未提交transaction的LSN

- minbuflsn: 最早的脏页的page LSN

在线备份起始阶段刷脏页就是为了提高minbuflsn。 启动在线备份时,如果minbuflsn < lowTransLsn,那么刷脏页有助于减少备份影像需要包含的日志文件的个数,同时也有助于缩短restore后Rollfoward的时间。

如果在线备份启动阶段延续了太长时间(比如说超过几分钟),那么意味着写磁盘操作存在性能瓶颈,或者页清理(page cleaning)效率上有问题。对于后一种情况,可以考虑使用DB2_USE_ALTERNATE_PAGE_CLEANING或者调整CHNGPGS_THRESH值。

更多相关内容,请点击阅读原文

长按二维码关注公众号


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存